home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
301-325
/
306
/
tree
/
tree.c
< prev
Wrap
C/C++ Source or Header
|
1995-03-14
|
3KB
|
163 lines
#include "stdio.h"
#include "libraries/dos.h"
extern struct Lock *Lock() ;
extern void *malloc() ;
char path[1000] ;
struct FileInfoBlock *fibs[100] ;
extern int Enable_Abort ;
int aborted ;
/*
* Implements a `string set'. Simple linear search.
*/
struct stringset {
struct stringset *next ;
char what[1] ;
} ;
struct stringset *add(s, ss)
char *s ;
struct stringset *ss ;
{
struct stringset *t ;
t = (struct stringset *)malloc(sizeof(struct stringset) + strlen(s)) ;
t->next = ss ;
strcpy(t->what, s) ;
return t ;
}
int member(s, ss)
register char *s ;
register struct stringset *ss ;
{
while (ss != 0) {
if (strcmp(s, ss->what)==0)
return 1 ;
ss = ss->next ;
}
return 0 ;
}
struct stringset *dirlist, *extlist ;
checkcontrolc() {
long _SetSignal() ;
if ((_SetSignal(0L, 0x1000L))&0x1000)
aborted = 1 ;
}
checkext(s)
register char *s ;
{
register char *p = 0 ;
while (*s) {
if (*s == '.')
p = s + 1 ;
s++ ;
}
return ((p==0) || ! member(p, extlist)) ;
}
char *mformat = "%s" ;
char outline[2000] ;
tree(s, l)
register char *s ;
register int l ;
{
register struct Lock *lk ;
register struct FileInfoBlock *fib = fibs[l] ;
register char *p, *q, *r ;
if (fib == 0) {
fib = (struct FileInfoBlock *)malloc(sizeof(struct FileInfoBlock)) ;
fibs[l] = fib ;
}
lk = Lock(s) ;
if (lk == NULL ||
(Examine(lk, fib) && fib->fib_DirEntryType <= 0)) {
return ;
}
r = s + strlen(s) ;
while (! aborted && ExNext(lk, fib)) {
strcpy(r, fib->fib_FileName) ;
if (fib->fib_DirEntryType <= 0) {
if (checkext(r)) {
p = outline ;
q = mformat ;
while (*q) {
if (*q == '%') {
q++ ;
switch (*q) {
case 's' :
strcpy(p, s) ;
p += strlen(p) ;
q++ ;
break ;
case 'd' :
sprintf(p, "%10ld", fib->fib_Size) ;
p += strlen(p) ;
q++ ;
break ;
default:
*p++ = *q++ ;
break ;
}
} else {
*p++ = *q++ ;
}
}
*p = 0 ;
printf("%s\n", outline) ;
}
} else {
if (! member(s, dirlist)) {
strcat(s, "/") ;
tree(s, l+1) ;
}
}
checkcontrolc() ;
}
UnLock(lk) ;
}
main(argc, argv)
int argc ;
char *argv[] ;
{
register char *p, *q ;
int option = 'f' ;
Enable_Abort = 0 ;
while (argc > 1) {
argc-- ;
argv++ ;
p = *argv ;
if (*p == '-') {
option = p[1] ;
q = p + 2 ;
if (*q == 0) {
argc-- ;
argv++ ;
if (argc <= 0)
break ;
q = *argv ;
}
} else
q = p ;
switch (option) {
case 'd': case 'D':
dirlist = add(q, dirlist) ;
break ;
case 'x': case 'X': case 'e': case 'E':
extlist = add(q, extlist) ;
break ;
case 'f': case 'F':
mformat = q ;
break ;
case '?': case 'H': case 'h':
printf(
"Usage: tree [-d directoryname] [-x extension] [-f format] [-?]\n") ;
exit(0) ;
default:
break ;
}
}
tree(path, 0) ;
}
_wb_parse() {}